iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Mobile Development

從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始系列 第 13

從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day13

  • 分享至 

  • xImage
  •  

Day13 StateObject

StateObject與ObservedObject的差別在於,如果同一頁有ObservedObject與State變數共同存在時,ObservedObject的變數會被State變數所影響,來看看以下的例子:

新增一個ObservableObject的class,裡面有一個Published變數:

class MyObject: ObservableObject {
    @Published var count = 0
}

宣告MyObject物件為ObservedObject狀態的變數:

struct SwiftUIView13_SubView: View {
    
    @ObservedObject var myObject = MyObject()
    
    var body: some View {
        VStack{
            Text("\(myObject.count)")
            
            Button(action: {
                myObject.count = myObject.count + 1
            }, label: {
                Text("Button")
            })
        }
    }
}

在頁面上引用這個SwiftUIView13_SubView:

struct SwiftUIView13: View {
        
    var body: some View {
        VStack{
            SwiftUIView13_SubView()
        }
    }
}

新增一個變數為State狀態,並且加入按鈕可以累加這個變數:

struct SwiftUIView13: View {
    
    @State var count = 0
    
    var body: some View {
        VStack{
            SwiftUIView13_SubView()
            
            Text("\(count)")
            
            Button(action: {count = count + 1} ) {
                Text("update")
            }
        }
    }
}

顯示如圖:

https://ithelp.ithome.com.tw/upload/images/20240813/20162607dmALwJKcy2.png

此時如果去按下上面的按鈕,確實會將MyObject內的變數count進行加1,但如果去按下下面的按鈕時,除了會把count變數加1之外,也會把MyObject內的變數count進行清除,表示當我們在更新SwiftUIView13的時候, 原本在SwiftUIView13_SubView中的myObject物件又被重新生成了一次,所以就會被歸零。

顯示如圖:

https://ithelp.ithome.com.tw/upload/images/20240813/20162607FCaS3GcdKB.png

要解決這個問題則必須要將ObservedObject使用StateObject來取代:

struct SwiftUIView13_SubView: View {
    
    @StateObject var myObject = MyObject()
    
    var body: some View {
        VStack{
            Text("\(myObject.count)")
            
            Button(action: {
                myObject.count = myObject.count + 1
            }, label: {
                Text("Button")
            })
        }
    }
}

所以現在兩個按鈕的累加數值,就會各自獨立互相不影響了。

從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day13 [完]


上一篇
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day12
下一篇
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day14
系列文
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言